15330
15159
Dus ik ben een sociaal spel aan het ontwikkelen, waarbij je een bepaalde hoeveelheid tijd hebt om een ​​taak uit te voeren. Omdat het sociaal is, kun je met de andere speler chatten.
Elke keer dat u een chatbericht ontvangt, krijgt u ook een melding en als u erop klikt, wordt u doorgestuurd naar het chatscherm met hem. Op dit moment werkt dit goed.
Wat ik niet wil, is dat de gebruiker een chatmelding ontvangt terwijl hij daadwerkelijk aan het spelen is op PlayActivity.
Het zou ook goed zijn als een reeds weergegeven melding zou kunnen worden genegeerd of opgeschort tot een later tijdstip terwijl hij op PlayActivity is.
Is dit haalbaar?
Een andere benadering zou kunnen zijn om alle reeds weergegeven meldingen te annuleren en de BroadcastReceiver in de slaapstand te zetten en alle meldingen en de BroadcastReceiver nieuw leven in te blazen nadat de PlayActivity is voltooid?
Ook niet mogelijk?
Kon de app in ieder geval vragen voordat hij de activiteit verlaat? op die manier kon ik hem waarschuwen en als hij toch vertrekt, zou het spel tegen hem gewaardeerd kunnen worden.
Wat ik nu doe is slechts een tijdelijke oplossing, ik maak de PlayActivity op volledig scherm en controleer of de focus is veranderd, bijv. als hij de statusbalk / het meldingsgebied naar beneden sleept. Maar dit is maar een hack, iets wat ik er heel graag mee zou willen afschaffen.
Zoals u ziet, weet ik niet precies wat de juiste aanpak hier zou kunnen zijn. Wat zou een professionele Android-softwareontwikkelaar in mijn geval doen?
Bij voorbaat bedankt!
Op dit moment behandel ik meldingen door een BroadcastReceiver uit te breiden. De code wordt aan het einde toegevoegd, als je andere delen van mijn code nodig hebt, laat het me weten!
openbare klasse PushBroadcastReceiver breidt BroadcastReceiver uit
{
@Override
public void onReceive (context context, intentie intentie)
{
proberen
{
JSONObject json =
nieuw JSONObject (
intent.getExtras ()
.getString ("KEY"));
melden (context, intentie, json);
}
catch (JSONException e)
{
L.debug (App.TAG, "JSONException:" + e.getMessage ());
}
}
private void-melding (Context ctx, Intent i, JSONObject dataObject) gooit JSONException
{
NotificationManager nm = (NotificationManager)
ctx.getSystemService (Context.NOTIFICATION_SERVICE);
boolean createNotification = false;
PendingIntent pi = null;
int gameId = 0;
// chat
if (dataObject.getString ("KEY_CHAT"). equals ("VALUE_CHAT")) {
Intent intent = new Intent (ctx, ChatActivity.class);
intent.putExtra ("tegenstanderUsername", dataObject.getString (PARSE_JSON_OPPONENT_USERNAME_KEY));
intent.putExtra ("gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY));
pi = PendingIntent.getActivity (ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
gameId = Geheel getal.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY));
createNotification = true;
// spel
} else if (dataObject.getString ("KEY_GAME"). equals ("VALUE_GAME")) {
Intent intent = new Intent (ctx, SS6RunningGameActivity.class);
intent.putExtra ("gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY));
gameId = Geheel getal.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY));
pi = PendingIntent.getActivity (ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
createNotification = true;
}
if (createNotification) {
Uri sound = Uri.parse ("android.resource: //"
+ ctx.getPackageName () + "/" + R.raw.push_notif);
int icon = R.drawable.icon_notification_android;
String tickerText =
dataObject.getString ("TEXT");
Notification mNotification = nieuwe NotificationCompat.Builder (ctx)
.setContentTitle (ctx.getResources (). getString (R.string.app_name))
.setContentText (tickerText)
.setSmallIcon (pictogram)
.setContentIntent (pi)
.setSound (geluid)
.setDefaults (Notification.DEFAULT_VIBRATE)
.setAutoCancel (true)
.setStyle (nieuwe NotificationCompat.BigTextStyle ()
.bigText (tickerText))
.bouwen();
nm.notify (gameId, mNotification);
}
} 
Dit kan op verschillende manieren worden benaderd.
Een van de eenvoudigste zou de volgende zijn:
Gebruik SharedPreferences. Voeg een booleaanse waarde toe om aan te geven dat PlayActivity momenteel actief is.
Doe in onCreate (Bundle) van PlayActivity het volgende:
// Initialisatie
SharedPreferences-voorkeuren = getSharedPreferences ("MY_PREF_FILE_NAME", 0);
Editor edit = voorkeuren.edit ();
// Hier is "PLAY_ACTIVITY_IS_RUNNING" de `key` en` true` de waarde
// We zeggen dat `PlayActivity` actief is
edit.putBoolean ("PLAY_ACTIVITY_IS_RUNNING", true);
edit.commit ();
Stel nu in onPause () van PlayActivity deze boolean in op false - wat aangeeft dat we op het punt staan ​​PlayActivity te verlaten:
// Initialisatie
SharedPreferences-voorkeuren = getSharedPreferences ("MY_PREF_FILE_NAME", 0);
Editor edit = voorkeuren.edit ();
// Hier is "PLAY_ACTIVITY_IS_RUNNING" de `key` en` false` de waarde
// We zeggen dat `PlayActivity` niet meer actief is
edit.putBoolean ("PLAY_ACTIVITY_IS_RUNNING", false);
edit.commit ();
Rust is vrij eenvoudig.
Open in PushBroadcastReceiver SharedPreferences en controleer de waarde die is toegewezen aan de sleutel PLAY_ACTIVITY_IS_RUNNING. Als deze waarde onwaar is, ga dan door met het posten van de meldingen. Anders, verzamel ze voor later.
openbare klasse PushBroadcastReceiver breidt BroadcastReceiver {uit
@Override
public void onReceive (context context, intentie intentie) {
SharedPreferences-voorkeuren = context.getSharedPreferences (
"MY_PREF_FILE_NAME", 0);
// Haal de waarde op die is opgeslagen voor sleutel "PLAY_ACTIVITY_IS_RUNNING"
// Het tweede argument `false` is de standaardwaarde
// voor het geval de sleutel niet bestaat - dit is logisch correct
boolean playActivityIsRunning = Preferences.getBoolean (
"PLAY_ACTIVITY_IS_RUNNING", false)
// PlayActivity wordt uitgevoerd
if (playActivityIsRunning) {
// bewaar JSON-objecten ergens en behandel ze later
} anders {
proberen {
JSONObject json = nieuw JSONObject (intent.getExtras (). GetString ("KEY"));
melden (context, intentie, json);
} catch (JSONException e) {
L.debug (App.TAG, "JSONException:" + e.getMessage ());
}
}
}
private void-melding (Context ctx, Intent i, JSONObject dataObject) genereert JSONException {
....
....
}
}
U moet een manier vinden om de in behandeling zijnde meldingen te plaatsen. Een oplossing hiervoor is om een ​​aparte uitzending naar een andere BroadcastReceiver te sturen in onPause () van PlayActivity. Maar dit kan problematisch zijn omdat onPause () wordt aangeroepen, zelfs wanneer de gebruiker van oriëntatie verandert. Misschien kan deze BroadcastReceiver na een vertraging van 1 seconde beginnen te werken? Dit zou voldoende tijd zijn om de activiteit opnieuw te creëren - en de waarde van PLAY_ACTIVITY_IS_RUNNING gereset (aangezien onCreate (Bundle) van PlayActivity opnieuw zal worden aangeroepen).
Dus de stroom zou zijn:
onPause wordt aangeroepen
stel de waarde in op false in SharedPreferences
verzend de uitzending om in behandeling zijnde meldingen af ​​te handelen
plaats de code van BroadcastReceiver in een Runnable. Post deze Runnable met een vertraging van 1 seconde met behulp van een handler.
binnen de BroadcastReciever => controleer de waarde van PLAY_ACTIVITY_IS_RUNNING in SharedPreferences <= dit zal na 1 seconde gebeuren. Als de gebruiker alleen de schermoriëntatie heeft gewijzigd, zou de waarde van PLAY_ACTIVITY_IS_RUNNING waar zijn. Anders zou de waarde false zijn als de gebruiker PlayActivity verlaat.
7
|
Uw antwoord
StackExchange.ifUsing ("editor", function () {
StackExchange.using ("externalEditor", function () {
StackExchange.using ("snippets", function () {
StackExchange.snippets.init ();
});
});
}, "code-snippets");
StackExchange.ready (function () {
var channelOptions = {
tags: "" .split (""),
id: "1"
};
initTagRenderer ("". split (""), "" .split (""), channelOptions);
StackExchange.using ("externalEditor", function () {
// Moet de editor na fragmenten activeren, als fragmenten zijn ingeschakeld
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using ("snippets", function () {
createEditor ();
});
}
anders {
createEditor ();
}
});
functie createEditor () {
StackExchange.prepareEditor ({
useStacksEditor: false,
heartbeatType: 'antwoord',
autoActivateHeartbeat: false,
convertImagesToLinks: waar,
noModals: waar,
showLowRepImageUploadWarning: true,
ReputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Aangedreven door \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "hoogte = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.7256 4.91628 46.09 ... 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C32.492 12.6954 34.14837.0451 14.0484C39.9723 14.0484 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.85.85.845. 38.5948 10.85.845. 4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "d = \" M25.6622 17.6335 C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379 C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512 V6.59049 C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231 C28.9913 4.66231 28.4555 4.94978 28.1109 26.45.07 21.59.09 21.59.087 C21.0134 11.9852 23.003 13.913 25.3754 13.913 C26.5612 13.913 27.4607 13.4902 28.1109 12.6616 C28.1109 12.7229 28.1161 12.7799 28.121 12.8346 C28.1256 12.8854 28.1301 12.9342 28.1301 27.1301 15.92.837 349 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335 ... C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.8045 11.9512C16.8045 13.2535 17.2637 13.8962 18.2965 19.329.80 13.8962 18.2965 19.329.80 13.8962 12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 8.57809 4.89931 7.9466 5.5079C7.58314 4.9466 5.5079C7.58314 4.9328. 9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10. 893 7.58817 10.893 8.94108V11.9512C10.893 13.2535 11.3711 13.8962 12.4044 13.8962C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179C16.4027 6.9118 d = \ "M3.31675 6.59049C3.31675 5,28821 2,83866 4,66232 1,82471 4,66232C0,791758 4,66232 0,313354 5,28821 0,313354 6,59049V11,9512C0,313354 13,2535 0,791758 13,8962 1,82471 13,8962C2,81675 / 13,8962 13,8962C2,81675 13,8962,33,51675 13,8962 \ u003cpath d = \ "M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 # 0.400291" fill = 0.400291 " "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e",
contentPolicyHtml: "Gebruikersbijdragen gelicentieerd onder \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (contentbeleid) \ u003c / a \ u003e",
allowUrls: waar
},
onDemand: waar,
discardSelector: ".discard-answer"
, onmiddellijkShowMarkdownHelp: true, enableTables: true, enableSnippets: true
});
}
});
Bedankt voor het bijdragen aan een antwoord op Stack Overflow!
Zorg ervoor dat u de vraag beantwoordt. Geef details en deel uw onderzoek!
Maar vermijd ...
Om hulp, opheldering vragen of reageren op andere antwoorden.
Uitspraken doen op basis van meningen; ondersteun ze met referenties of persoonlijke ervaring.
Bekijk onze tips voor het schrijven van goede antwoorden voor meer informatie.
Concept opgeslagen
Concept verwijderd
Meld u aan of log in
StackExchange.ready (function () {
StackExchange.helpers.onClickDraftSave ('# login-link');
});
Meld u aan met Google
Meld u aan met Facebook
Meld u aan met e-mail en wachtwoord
Verzenden
Post als gast
Naam
E-mail
Vereist, maar nooit getoond
StackExchange.ready (
functie () {
StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f25114521% 2fis-het-mogelijk-op-schorten-reeds-weergegeven-en-nieuwe-meldingen- voor-een-bedrag-van% 23nieuw-antwoord ',' vraagpagina ');
}
);
Post als gast
Naam
E-mail
Vereist, maar nooit getoond
Plaats uw antwoord
Gooi weg
Door op “Plaats uw antwoord” te klikken, gaat u akkoord met onze servicevoorwaarden, privacybeleid en cookiebeleid
Niet het antwoord waar je naar zoekt? Blader door andere vragen, getagde Android-meldingen, push of stel uw eigen vraag.